package com.cictec.middleware.tde.rm.protocol;

import java.io.Serializable;
import java.util.Date;

/**
 * <b>锐明协议结构：</b><br>
 * 
 * 	序号 	数据项 		长度 		说明<br>
 * 	1		开始字头 	2 字节 		起始字头用“0x24 0x24”表示。<br>
 *	2		数据长度		1 字节 		从协议版本字段到数据标识字段字节数总和。<br>
 * 	3		协议版本 	1 字节 		通信协议版本，高 4 位为版本号，低 4 位为分版本号。<br>
 * 	4		流水号 		1 字节 		0-255 自动循环生成<br>
 * 	5		命令字 		1 字节 		详见数据内容部分<br>
 * 	6		发送时间 	4 字节 		数据包发送时的时间，每次发送前更新该时间标签<br>
 * 	7		终端编号	 	3 字节 		详见 2.2 数据定义<br>
 * 	8		线路编号 	2 字节	 	详见 2.2 数据定义<br>
 * 	9		数据内容 	不定长 		不同命令字有不同内容，最长不超过 242 字节。<br>
 * 	10		数据标识 	1 字节	 	0：表示实时发送的数据，1：表示历史存储的数据<br>
 * 	11		校验和 		1 字节 		CRC 校验和，校验范围从协议版本字段到数据标识。<br>
 * 	12		结束字尾 	2 字节 		起始字头用“0x23 0x23”表示。<br>
 */
//public class RmAbstractTerminalMessage extends TerminalMessage implements Serializable{
public class TerminalMessage extends AbstractTerminalMessage implements Serializable{

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5197278634759346269L;
	private Header header;
	
	public TerminalMessage(Header header){
		this.header = header;
	}
	
	@Override
	public int getMessageId() {
		// TODO Auto-generated method stub
		return header.getMessageId();
	}
	
	@Override
	public String getTerminalId() {
		// TODO Auto-generated method stub
		return String.valueOf(header.getTerminalId());
	}
	
	/**
	 * <b>锐明协议结构：</b><br>
	 * 
	 * 	序号 	数据项 		长度 		说明<br>
	 * 	1		开始字头 	2 字节 		起始字头用“0x24 0x24”表示。<br>
	 *	2		数据长度		1 字节 		从协议版本字段到数据标识字段字节数总和。<br>
	 * 	3		协议版本 	1 字节 		通信协议版本，高 4 位为版本号，低 4 位为分版本号。<br>
	 * 	4		流水号 		1 字节 		0-255 自动循环生成<br>
	 * 	5		命令字 		1 字节 		详见数据内容部分<br>
	 * 	6		发送时间 	4 字节 		数据包发送时的时间，每次发送前更新该时间标签<br>
	 * 	7		终端编号	 	3 字节 		详见 2.2 数据定义<br>
	 * 	8		线路编号 	2 字节	 	详见 2.2 数据定义<br>
	 * 	9		数据内容 	不定长 		不同命令字有不同内容，最长不超过 242 字节。<br>
	 * 	10		数据标识 	1 字节	 	0：表示实时发送的数据，1：表示历史存储的数据<br>
	 * 	11		校验和 		1 字节 		CRC 校验和，校验范围从协议版本字段到数据标识。<br>
	 * 	12		结束字尾 	2 字节 		起始字头用“0x23 0x23”表示。<br>
	 */
	
	public Header getHeader() {
		return header;
	}

	public void setHeader(Header header) {
		this.header = header;
	}


	static public class Header extends AbstractMessageHeader{
		public Header() {
			
		}
		public Header(int messageId) {
			this.messageId = messageId;
		}
		/**
		 * 数据长度 1 字节 从协议版本字段到数据标识字段字节数总和
		 */
		private int bodyLength;
		/**
		 * 协议版本 1 字节 通信协议版本，高 4 位为版本号，低 4 位为分版本号
		 */
		private String version = "2.0";
		/**
		 * 流水号 1 字节 0-255 自动循环生成
		 */
		private int messageSequence;
		/**
		 * 命令字 1 字节 详见数据内容部分
		 */
		private int messageId;
		/**
		 * 发送时间 4 字节 数据包发送时的时间，每次发送前更新该时间标签
		 */
		private Date sendTime;
		/**
		 * 终端编号 3 字节 详见 2.2 数据定义
		 */
		private long terminalId;
		// private int terminalId;
		/**
		 * 线路编号 2 字节 详见 2.2 数据定义
		 */
		private int lineId;
		/**
		 * 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据
		 */
		private int dataFlag;
		/**
		 * 校验和 1 字节 CRC 校验和，校验范围从协议版本字段到数据标识
		 */
		private int validateCode;
		/**
		 * 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据
		 */
		private boolean realTimeData;

		/** 数据长度 1 字节 从协议版本字段到数据标识字段字节数总和 */
		public int getBodyLength() {
			return bodyLength;
		}

		/** 数据长度 1 字节 从协议版本字段到数据标识字段字节数总和 */
		public void setBodyLength(int bodyLength) {
			this.bodyLength = bodyLength;
		}

		/** 协议版本 1 字节 通信协议版本，高 4 位为版本号，低 4 位为分版本号 */
		public String getVersion() {
			return version;
		}

		/** 协议版本 1 字节 通信协议版本，高 4 位为版本号，低 4 位为分版本号 */
		public void setVersion(String version) {
			this.version = version;
		}

		/** 流水号 1 字节 0-255 自动循环生成 */
		public int getMessageSequence() {
			return messageSequence;
		}

		/** 流水号 1 字节 0-255 自动循环生成 */
		public void setMessageSequence(int messageSequence) {
			this.messageSequence = messageSequence;
		}

		/** 命令字 1 字节 详见数据内容部分 */
		public int getMessageId() {
			return messageId;
		}

		/** 命令字 1 字节 详见数据内容部分 */
		public void setMessageId(int messageId) {
			this.messageId = messageId;
		}

		/** 发送时间 4 字节 数据包发送时的时间，每次发送前更新该时间标签 */
		public Date getSendTime() {
			return sendTime;
		}

		/** 发送时间 4 字节 数据包发送时的时间，每次发送前更新该时间标签 */
		public void setSendTime(Date sendTime) {
			this.sendTime = sendTime;
		}

		/** 终端编号 3 字节 详见 2.2 数据定义 */
		public long getTerminalId() {
			return terminalId;
		}

		/** 终端编号 3 字节 详见 2.2 数据定义 */
		public void setTerminalId(long terminalId) {
			this.terminalId = terminalId;
		}

		/** 线路编号 2 字节 详见 2.2 数据定义 */
		public int getLineId() {
			return lineId;
		}

		/** 线路编号 2 字节 详见 2.2 数据定义 */
		public void setLineId(int lineId) {
			this.lineId = lineId;
		}

		/** 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据 */
		public int getDataFlag() {
			return dataFlag;
		}

		/** 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据 */
		public void setDataFlag(int dataFlag) {
			this.dataFlag = dataFlag;
			this.realTimeData = dataFlag == 0 ? true : false;
		}

		/** 校验和 1 字节 CRC 校验和，校验范围从协议版本字段到数据标识 */
		public int getValidateCode() {
			return validateCode;
		}

		/** 校验和 1 字节 CRC 校验和，校验范围从协议版本字段到数据标识 */
		public void setValidateCode(int validateCode) {
			this.validateCode = validateCode;
		}

		/** 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据 */
		public boolean isRealTimeData() {
			return realTimeData;
		}

		/** 数据标识 1 字节 0：表示实时发送的数据，1：表示历史存储的数据 */
		public void setRealTimeData(boolean realTimeData) {
			this.realTimeData = realTimeData;
		}

		@Override
		public String toString() {
			return "Header [messageId=" + messageId + ", bodyLength=" + bodyLength + ", version=" + version
					+ ", messageSequence=" + messageSequence + ", sendTime=" + sendTime + ", terminalId=" + terminalId
					+ ", lineId=" + lineId + ", dataFlag=" + dataFlag + ", validateCode=" + validateCode
					+ ", realTimeData=" + realTimeData + "]";
		}

	}



}
